package org.example.Stream;

import java.util.ArrayList;
import java.util.List;

/**
 * @Author : zhangbo
 * @data : 2024/7/26
 * @description :stream在处理集合数据时，当数据量比较小时，for循环更快
 */

/**
 * 操作开销：
 *
 * Stream API 在执行操作时引入了额外的抽象层和操作开销。例如，每个 Stream 操作都可能创建额外的迭代器或中间对象。
 * 方法调用：
 *
 * 使用 Stream 时，每次操作都是方法调用，这涉及更多的动态调度和方法查找，而 for 循环则直接在编译后的字节码中执行。
 * 内部迭代：
 *
 * Stream API 通常使用内部迭代，这意味着迭代逻辑由库内部实现，可能不如外部迭代（如 for 循环）直接和高效。
 * 优化：
 *
 * 现代JVM和JIT编译器对传统的 for 循环进行了高度优化，包括循环展开等技术，这可以减少循环中的开销。
 * 并行开销：
 *
 * 如果 Stream 被并行化（使用 parallelStream()），那么线程管理、任务分配和线程同步的开销可能会超过小数据集上的性能优势。
 * 内存使用：
 *
 * Stream API 可能会创建更多的对象（例如，操作中的中间集合），这在小数据集上可能导致更高的内存使用和垃圾回收开销。
 * 编译器优化：
 *
 * JIT编译器对 for 循环的优化可能更有效，因为循环的结构更简单、更可预测。
 * 代码启动时间：
 *
 * Stream API 需要时间来启动，特别是当它需要设置流水线和处理初始的集合时。相比之下，for 循环的启动时间可以忽略不计。
 * 实现复杂性：
 *
 * Stream API 提供了许多高级功能，如映射、过滤、归约等，这些功能的实现可能比等效的 for 循环中的手动实现更复杂。
 */
public class StreamTest2 {
    public static void main(String[] args) {
        List<Employee>list1=new ArrayList<>();
        for (int i = 0; i < 100; i++) {
            Employee employee=new Employee();
            employee.setAge(i);
            list1.add(employee);
        }
        Long str1=System.currentTimeMillis();
        for (Employee employee : list1) {
            System.out.println(employee.getAge());
        }
        Long end1=System.currentTimeMillis();
        long res1=end1- str1;
        System.out.println("结果1:"+(res1));


        Long str2=System.currentTimeMillis();
        list1.stream().forEach(
                a->{
                    System.out.println(a.getAge());
                }
        );
        Long end2=System.currentTimeMillis();
        long res2=end2- str2;
        System.out.println("结果2:"+(res2));
        if(res1>res2){
            System.out.println("stream快:"+(res1-res2));
        }else{
            System.out.println("for循环快:"+(res2-res1));
        }


    }
}
